﻿
//函数和静态变量信息分析类
namespace n_Const
{
using System;
using n_ET;
using n_MemberType;
using n_Parse;
using n_ParseNet;
using n_VarList;
using n_VarNode;
using n_VarType;
using n_WordList;

public static class Const
{
	static string UnitName;
	
	//获取元件成员信息,生成: 函数列表 变量列表 常量列表
	public static void Record()
	{
		//常量列表初始化
		VarList.Clear();
		
		Parse.DealWith( ref UnitName, new Parse.MemberListHandle( 成员列表 ) );
	}
	
	static void 成员列表( int Index )
	{
		for( int i = 1; i < ParseNet.NodeSet[ Index ].Length; ++i ) {
			int index = int.Parse( ParseNet.NodeSet[ Index ][ i ] );
			
			//判断是否元件定义
			if( ParseNet.NodeSet[ index ][ 0 ] == ParseNet.Node.元件 ) {
				元件( index );
				continue;
			}
			//判断常量定义
			if( ParseNet.NodeSet[ index ][ 0 ] == ParseNet.Node.常量 ) {
				常量( index );
				continue;
			}
		}
	}
	
	static void 元件( int Index )
	{
		Parse.Unit( ref UnitName, Index, new Parse.MemberListHandle( 成员列表 ) );
	}
	
	static void 常量( int Index )
	{
		//获取成员类型
		string VisitType = null;
		string RealRefType = null;
		int MemberTypeIndex = int.Parse( ParseNet.NodeSet[ Index ][ 1 ] );
		Parse.GetMemberType( MemberTypeIndex, ref VisitType, ref RealRefType );
		
		//获取常量名称
		int NameIndex = int.Parse( ParseNet.NodeSet[ Index ][ 4 ] );
		string Name = WordList.GetWord( NameIndex );
		if( !VarList.CanDefineStatic( UnitName + "." + Name ) ) {
			ET.WriteParseError( NameIndex, "常量名非法:已经定义了同名的成员--" + UnitName + "." + Name );
			return;
		}
		//获取常量的定义类型
		int VarTypeIndex = int.Parse( ParseNet.NodeSet[ Index ][ 3 ] );
		string vartype = Parse.GetType( UnitName, VarTypeIndex );
		if( vartype == null ) {
			return;
		}
		if( !VarType.isBase( vartype ) ) {
			ET.WriteParseError( NameIndex, "常量的类型应为基本类型: " + vartype );
			return;
		}
		//添加常量
		VarNode node = new VarNode();
		node.SetStaticValue( UnitName + "." + Name, vartype, VisitType, RealRefType, true, NameIndex, -1, NameIndex );
		node.isConst = true;
		VarList.Add( node );
		
		if( RealRefType == MemberType.RealRefType.link ) {
			ET.WriteParseError( NameIndex, "定义常量为链接类型时不可以指定常量值" );
			return;
		}
		//获取常量的实际类型
		node.Value = "I " + ParseNet.NodeSet[ Index ][ 6 ];
		
//		if( ConstType != vartype && !Operation.CanSwitch( ConstType, vartype ) ) {
//			ET.WriteParseError( ConstIndex, "常量类型与定义类型赋值不兼容: " + vartype + " <- " + ConstType );
//			return;
//		}
	}
}
}










